package thread.n8;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

/**
 * forkJoin的测试类。
 */
public class ForkJoinTest {
    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool(4);
        System.out.println(pool.invoke(new AddTask1(5)));
    }
}


/**
 * 提交给ForkJoin线程池的任务需要继承【RecursiveTask（有返回值）】或【RecursiveAction（没有返回值）】。
 *      表示：这是一个可以被【ForkJoin线程池】，拆分的线程。
 * 比如：下面定义了一个对 1~n 之间的整数进行求和的任务。
 */
class AddTask1 extends RecursiveTask<Integer> {
    int n;

    public AddTask1(int n) {
        this.n = n;
    }

    @Override
    public String toString() {
        return "{" + n + '}';
    }

    @Override
    protected Integer compute() {
        System.out.println("compute，"+n);

        // 如果 n 已经为 1，可以求得结果了
        if (n == 1) {
            System.out.println("join()，"+n);
            return n;
        }

        // 将任务进行拆分(fork)
        AddTask1 t1 = new AddTask1(n - 1);
        t1.fork();
        System.out.println("fork()，"+n+"："+t1);

        // 合并(join)结果
        int result = n + t1.join();
        System.out.println("join()："+n+" + "+t1+"："+result);
        return result;
    }
}